package utils.file;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class BatchImport {
	/**
	 * 读取excel信息
	 * @Title:        getAllByExcel 
	 * @Description:  TODO(这里用一句话描述这个方法的作用) 
	 * @param:        @param file
	 * @param:        @return    
	 * @return:       List    
	 * @throws 
	 * @author        caofan
	 * @Date          2015年12月3日 下午6:50:27
	 */
	public static List getAllByExcel(File file) {
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		Map<String, Object> map = null;
		try {
			InputStream input = new FileInputStream(file);//将文件类流化
			Workbook wb = null;
			//不同版本的excel进行不同方式的读取
			if (file.getName().contains(".xlsx")) {
				wb = new XSSFWorkbook(input);//EXCEL2007以上
			} else {
				wb = new HSSFWorkbook(input);//EXCEL2003以下
			}
			int sheetSum =  wb.getNumberOfSheets();
			for (int j = 0; j < sheetSum; j++) {
			Sheet sheet = wb.getSheetAt(j); // 获得第一个表单
			Iterator<Row> rows = sheet.rowIterator(); //
			while (rows.hasNext()) {
				map = new HashMap<String, Object>();
				Row row = rows.next(); // 获得行数据				
				if(row.getRowNum()==0){
					continue;//把第一行的表头数据去掉
				}				
				Iterator<Cell> cells = row.cellIterator(); // 获得第一行的迭代器
				int i = 1;
				while (cells.hasNext()) {
					Cell cell = cells.next();					
					//把每一列的数据按读取顺序放到map里,键值从字符001开始
					if (i == 1) {
						map=formatChange(map,"001",cell);
					}
					if (i == 2) {
						map=formatChange(map,"002",cell);
					}
					if (i == 3) {
						map=formatChange(map,"003",cell);
					}
					if (i == 4) {
						map=formatChange(map,"004",cell);
					}
					if (i == 5) {
						map=formatChange(map,"005",cell);
					}
					if (i == 6) {
						map=formatChange(map,"006",cell);
					}
					if (i == 7) {
						map=formatChange(map,"007",cell);
					}
					if (i == 8) {
						map=formatChange(map,"008",cell);
					}
					if (i == 9) {
						map=formatChange(map,"009",cell);
					}
					if (i == 10) {
						map=formatChange(map,"010",cell);
					}
					if (i == 11) {
						map=formatChange(map,"011",cell);
					}
					if (i == 12) {
						map=formatChange(map,"012",cell);
					}
					if (i == 13) {
						map=formatChange(map,"013",cell);
					}
					if (i == 14) {
						map=formatChange(map,"014",cell);
					}
					if (i == 15) {
						map=formatChange(map,"015",cell);
					}
					//暂定map最多只装15列的数据，将来若不能满足，可继续增加
					i++;
				}
				list.add(map);
			}
			}
		} catch (IOException ex) {
			ex.printStackTrace();
		}		
		return list;
	}
	/**
	 * 数据格式转化
	 * @Title:        formatChange 
	 * @Description:  TODO(这里用一句话描述这个方法的作用) 
	 * @param:        @param map
	 * @param:        @param str
	 * @param:        @param cell
	 * @param:        @return    
	 * @return:       Map    
	 * @throws 
	 * @author        caofan
	 * @Date          2015年12月3日 下午6:50:17
	 */
	public static Map formatChange(Map map,String str,Cell cell){
		switch (cell.getCellType()) { // 根据cell中的类型来输出数据
		case HSSFCell.CELL_TYPE_NUMERIC:
			//将数字类型也转为字符类型
			DecimalFormat df = new DecimalFormat("0");  
		    String strCell = df.format(cell.getNumericCellValue()); 
			map.put(str,strCell);
			break;
		case HSSFCell.CELL_TYPE_STRING:
			map.put(str, cell.getStringCellValue());//字符型
			break;
		case HSSFCell.CELL_TYPE_BOOLEAN:
			map.put(str, cell.getBooleanCellValue());//布尔型
			break;
		case HSSFCell.CELL_TYPE_FORMULA:
			cell.setCellType(HSSFCell.CELL_TYPE_STRING);
			map.put(str, cell.getStringCellValue());//分子式
			break;
		default:
			break;		
		}
		return map;
	}
}
